#ifndef CONTROL_H
#define CONTROL_H

#include "ui_message.h"
#include <pthread.h>
#include <stdbool.h>
#include "animation.h"
#include "indicators.h"
#include "gear.h"
#include "tires.h"
#include "lvgl/lvgl.h"
#include <time.h>
#include "mode.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <pthread.h>
#include "data_manager.h"
#include <stdatomic.h>



// 互斥锁初始化函数声明
void init_mutex(void);

extern DrivingData data_backup;


extern volatile bool is_console_input_active;

static void start_right_signal_anim(void *arg);
static void stop_right_signal_anim(void *arg);

// 原子状态标志
extern _Atomic int msgbox_active_flag;
extern _Atomic bool data_generation_in_progress;
// 控制函数
void *iu_main(void *arg);
bool toggle_left_turn_signal(bool enable);
bool toggle_right_turn_signal(bool enable);
bool toggle_hazard_lights(bool enable);

// 轮胎控制函数
void set_tire_pressure(TirePosition position, int pressure);
void set_tire_temperature(TirePosition position, int temperature);

// 声明共享变量
 extern pthread_mutex_t indicator_mutex;

extern int driving_distance;
extern int driving_time;
extern float fuel_consumption;
extern int total_distance;

// 声明路径处理函数
bool get_data_path(char *buf, size_t size);
bool ensure_data_directory_exists(void);

// 声明数据管理函数
void update_display(void *param);
bool generate_driving_data(void);
bool init_driving_data(void);
bool load_driving_data(void);
bool reset_driving_data(void);

// 添加备份函数声明
bool backup_driving_data(void);
bool restore_driving_data(void);

// 文件IO控制器
typedef struct {
    pthread_t thread;
    pthread_mutex_t lock;
    bool running;
} FileIOController;

extern FileIOController fileio_controller;

// 显示模式枚举
typedef enum {
    CONSOLE_MODE,       // 控制台模式
    DATA_VIEW_MODE      // 数据查看模式
} DisplayMode;

// 全局显示模式控制
extern DisplayMode current_mode;

// 添加消息框回调函数声明
void msgbox_event_handler(lv_event_t *e);

void emergency_recovery(void);
extern void reset_and_update_data(void *param);
bool save_driving_data(bool lock);

// 新增内存管理API
size_t get_available_memory(void);
bool ensure_memory_available(size_t required);

// 新增锁超时机制
#define SAFE_LOCK(mtx, timeout_ms) do { \
    if(!try_lock_with_timeout(mtx, timeout_ms)) { \
        log_message(LOG_ERROR, "Lock timeout at %s:%d", __FILE__, __LINE__); \
        emergency_recovery(); \
        return false; \
    } \
} while(0)

// 新增互斥锁尝试函数
bool try_lock_with_timeout(pthread_mutex_t *mutex, int timeout_ms);
void init_small_font_style(void);

extern void* init_driving_data_thread(void* arg);

static void init_style(void);

void init_style_safe(void);
void safe_obj_add_style(lv_obj_t* obj, lv_style_t* style, lv_part_t part, lv_state_t state);

extern ThreadSafeUIMessageQueue g_ui_message_queue;

void print_console_menu(void);

void safe_async_call(void (*func)(void*), void *arg);

void http_response_handler(const char* response);
void http_get_async(const char* url, void (*callback)(const char*));
void init_weather_service();


// 消息类型定义
#define MSG_UPDATE_WEATHER_TEMP 1003 // 天气温度更新消息类型

// 天气更新消息结构体
typedef struct {
    UIMessageBase base;
    char value[16]; // 存储温度值，带单位
} UIWeatherTempMsg;

// HTTP天气服务函数声明
void http_get_async(const char* url, void (*callback)(const char*));
void http_response_handler(const char* json_data);
void init_weather_service(void);

// UI控件外部声明
extern lv_obj_t *ui_wendu1;

#endif // CONTROL_H